<?php

error_reporting(E_ALL & ~(E_NOTICE|E_WARNING));

/***********************************************************
Script de Processamento do retorno do pagseguro:
Implementação dos logs de gravação das etapas do processo.
Implementação do envio de email com dados da transação para o admin.
Implementação do envio de email de sucesso com dados da transação para o cliente.
Implementação do envio de email com o cupom para o cliente.
Implementação do envio de email com o cupom para todos os clientes ao ativar a oferta
Tratamento de envio de email e suporte a smtp e sendmail

16-01-2011
@autor: Bruno Santos
brunosantos.em@gmail.com
www.brunowebstore.com.br

release 1.28
*************************************************************/

require_once("../../util/Util.php");

Util::log("\n======================================== Retorno  -  Post Pag Seguro v 1.28");

require_once(dirname(dirname(dirname(__FILE__))) . '/app.php');
 
$param = gravar_request();
 
function gravar_request(){
	
	$parametros="";
	
	foreach ($_REQUEST as $nome_campo => $valor_campo) {
	
		$parametros .= $nome_campo . "=" . $valor_campo . "&";
  } 
   return $parametros;
}

//Util::log("Parametros:: $param");

header('Content-Type: text/html; charset=ISO-8859-1');

define('TOKEN', $INI['pagseguro']['mid']);

Util::log("TOKEN :: ". $INI['pagseguro']['mid']);

class PagSeguroNpi {
	
	private $timeout = 20; // Timeout em segundos
	
	public function notificationPost() {
		$postdata = 'Comando=validar&Token='.TOKEN;
		foreach ($_POST as $key => $value) {
			$valued    = $this->clearStr($value);
			$postdata .= "&$key=$valued";
		}
		return $this->verify($postdata);
	}
	
	private function clearStr($str) {
		if (!get_magic_quotes_gpc()) {
			$str = addslashes($str);
		}
		return $str;
	}
	
	private function verify($data) {
		$curl = curl_init();
		curl_setopt($curl, CURLOPT_URL, "https://pagseguro.uol.com.br/pagseguro-ws/checkout/NPI.jhtml");
		curl_setopt($curl, CURLOPT_POST, true);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_HEADER, false);
		curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
		$result = trim(curl_exec($curl));
		curl_close($curl);
		return $result;
	}

}
 
if (count($_POST) > 0) {
	
	Util::log($_POST['ProdID_1']. " - Iniciando verificacao do token..."); 
	$npi = new PagSeguroNpi();
	$result = $npi->notificationPost();
	
	$ProdID_1 	= isset($_REQUEST['ref_transacao']) ? $_REQUEST['ref_transacao'] : ''; 
	if($ProdID_1 == ""){
		$ProdID_1 	= isset($_REQUEST['ProdID_1']) ? $_REQUEST['ProdID_1'] : ''; 
	}
		
	$transacaoID = isset($_POST['TransacaoID']) ? $_POST['TransacaoID'] : '';
	
	Util::log($_POST['ProdID_1']. " - Resposta ...:".$result);
	
	  if ($result == "VERIFICADO") {
	  
			Util::log($_POST['ProdID_1']. " - Token confirmado. Processando compra.");  
			
			if( $_POST['StatusTransacao'] == 'Aprovado') {
		
				Util::log($_POST['ProdID_1']. " - Status aprovado. Preparando para atualizar tabela de pedidos. Buscando pedido codigo: ".$_POST['ProdID_1']);
		 
				$order = Table::Fetch('order', $_POST['ProdID_1']);
				
				if ( $order['state'] == 'unpay' ) {
				
					Util::log($_POST['ProdID_1']. " - Pedido encontrado com status nao pago. Preparando para atualizar...");
		 
					$ProdValor_1 =str_replace(",",".",$_POST['ProdValor_1']);
						 
					$table = new Table('order');
					$table->SetPk('id', $_POST['ProdID_1']);
					$table->pay_id = $_POST['TransacaoID'];
					$table->money =  $ProdValor_1;
					$table->state = 'pay';
					$flag = $table->update(array('state', 'pay_id', 'money'));
		
					
					if ( $flag ) {
					
						Util::log($_POST['ProdID_1']. " - Pedido atualizado para pago com sucesso. Preparando para inserir o registro na tabela de pagamento.");
					
						$ProdValor_1 =str_replace(",",".",$_POST['ProdValor_1']);
						
						$table = new Table('pay');
						$table->id = $_POST['TransacaoID'];
						$table->order_id = $_POST['ProdID_1'];
						$table->money = $ProdValor_1;
						$table->currency = 'BRL';
						$table->bank = $_POST['TipoPagamento'];
						$table->service = 'pagseguro';
						$table->create_time = time();
						$table->insert( array('id', 'order_id', 'money', 'currency', 'service', 'create_time', 'bank') );
						
						Util::log($_POST['ProdID_1']. " - Registro inserido na tabela de pagamento com sucesso. Preparando para buscar os dados e envio do cupom ...");
						  
						//update team,user,order,flow state//
						ZTeam::BuyOne($order);
						
						// buscando dados do cupom
						//$cond = array("order_id" => $_POST['ProdID_1']);
						//$cupom = Table::Fetch('coupon', $cond );
					  
						// buscando dados da oferta - verificando se ela está ativa para enviar cupons para todos os clientes que compraram
					    $team = Table::Fetch('team', $order['team_id']);
						 
						 if($team['now_number'] >= $team['min_number']){  //<!--  A oferta esta ativa  --> 
						  
							Util::log($_POST['ProdID_1']. " - Oferta ativa -  buscando os cupons dos usuarios para envio...");
						 
							$sql = "select a.id,a.secret,a.order_id,b.username,b.email,c.title,c.homepage,c.location from coupon a,user b, partner c where a.partner_id = c.id and a.user_id = b.id and a.envioucupom is null and a.consume='N' and a.team_id = ".$order['team_id'];
							$rs = mysql_query($sql);
							
							Util::log("Encontrado (".mysql_num_rows($rs).") oferta(s) para envio.");
							 
							//Util::log($_POST['ProdID_1']. " $sql  ");
							
							$achou = false;
							while($row = mysql_fetch_object($rs)){
							    $achou = true;
								$numcupom 	= $row->id;
								$senha 		= $row->secret; 
								$pedido  	= $row->order_id; 
								$email 		= $row->email; 
								$username  	= $row->username; 
								$parceiro  	= $row->title ; 
								$homepage   = $row->homepage  ; 
								$location   = $row->location  ; 
								
								Util::log("Pedido: ".$pedido. " - Numero do cupom: $numcupom - senha: $senha .");
						 
								$body = 
								"
								<h3>Parabéns $username, sua transação foi concluída com sucesso e você acaba de receber os dados do seu cupom</h3>
								<br>Número do Cupom: $numcupom 
								<br>Senha do Cupom: $senha	
   								
								<h3>Local de consumação de seu cupom</h3>
								<p>".$parceiro."</p>
								<p>".$location ."</p>
								<p>".$homepage."</p>
								<p>  Aproveite !</p> 
								";
								
								$body = utf8_decode($body); 
						
								if(Util::postemailCliente($body,utf8_decode($site. " - Seu Cupom já está disponível."),$email)){
									Util::log($pedido. " - Email para o cliente com dados do cupom enviado com sucesso(".$email.")...");
									
									$sql2 = "update coupon set envioucupom =1 where id = '".$numcupom."'";
									$rs2 = mysql_query($sql2);
									if($rs2){
										Util::log($pedido. " - campo envioucupom atualizado.");
									 }
									 else{
									 	Util::log($pedido. " - campo envioucupom nao atualizado. $sql2");
									 }
							
								}
								else{
									Util::log($pedido. " - Erro no envio do email... (".$email.") .");
								}
								
							}
								
						 
						 }
						 else{
						 	Util::log($_POST['ProdID_1']. " - A oferta desta compra nao esta ativa, numero minimo nao alcancado ainda (".$team['min_number'].") total comprados (".$team['now_number'].").");
						 
						 }
						 if( !$achou){
						  	Util::log($_POST['ProdID_1']. " - Ainda nenhum cupom disponivel para envio:  Minimo: (".$team['min_number'].") - Total comprados (".$team['now_number'].").");
						 
						 }
						  
						 
					    Util::log($_POST['ProdID_1']. " - Preparando para enviar o email de compra concluida para o cliente (".$_POST['CliEmail'].")...");
						
						$site = $INI['system']['sitename']; 
						 
						 $body =  "<h3>O pedido numero ".$_POST['ProdID_1']." acaba de ser aprovado. </h3>";
						 $body  = $body ." <h3>Você receberá o número e a senha do cupom em instantes, você pode também imprimir o cupom através de nosso site!</h3>"; 
						 $body  = $body ." <p>Dados do pedido </p> 
						 <br>Numero do pedido no sistema de ofertas: <b>".$ProdID_1."</b>
						 <br> Nome do cliente: <b>".$_POST['CliNome']."</b> 
						 <br> Email do cliente: <b>".$_POST['CliEmail']."</b> 
						 <br> Status da transacao: <b>".$_POST['StatusTransacao']."</b>   
						 <br> Tipo do pagamento: <b>".$_POST['TipoPagamento']."</b>   
						 <br> Produto comprado: <b>".$_POST['ProdDescricao_1']."</b>   
						 <br> Codigo produto: <b>".$_POST['ProdID_1']."</b>   
						 <br> Data do pagamento: <b>".$_POST['DataTransacao']."</b> " ;
					 
						$body = utf8_decode($body);   
						if(Util::postemailCliente($body,utf8_decode($site. " - Pagamento Concluído"),$_POST['CliEmail'])){
							Util::log($_POST['ProdID_1']. " - Email para o cliente enviado com sucesso... Preparando para enviar o email para o administrador  (".Util::EMAIL_WEBMASTER.")...");
						}
						else{
							Util::log($_POST['ProdID_1']. " - Erro no envio do email... Preparando para enviar o email para o administrador...");
						}
						 
						 $body =  "O pedido numero ".$_POST['ProdID_1']." acaba de ser aprovado e o status desta compra ja foi atualizado para pago no seu sistema de ofertas. <br>";
						 $body  = $body ." <h3>Dados do pedido </h3> Numero do pedido no sistema de ofertas: <b>".$ProdID_1."</b>
						 <br> Nome do cliente: <b>".$_POST['CliNome']."</b> 
						 <br> Email do cliente: <b>".$_POST['CliEmail']."</b> 
						 <br> Status da transacao: <b>".$_POST['StatusTransacao']."</b>   
						 <br> Tipo do pagamento: <b>".$_POST['TipoPagamento']."</b>   
						 <br> Produto comprado: <b>".$_POST['ProdDescricao_1']."</b>   
						 <br> Codigo produto: <b>".$_POST['ProdID_1']."</b>   
						 <br> Data do pagamento: <b>".$_POST['DataTransacao']."</b> " ;
						 
					    $body = utf8_encode($body);   
						if(Util::postemail($body,utf8_decode($site. " - Pedido ".$_POST['ProdID_1']." ".$_POST['StatusTransacao']))){
							Util::log($_POST['ProdID_1']. " - Email para o administrador enviado com sucesso. Retornando para a loja");
						}
						else{
							Util::log($_POST['ProdID_1']. " - Erro no envio do email (".Util::EMAIL_WEBMASTER.")... Retornando para a loja ");
						}
						 
				
					}
					else{
						Util::log($_POST['ProdID_1']. " - Nao foi possivel atualizar a tabela order com os dados do pedido ".$_POST['ProdID_1'].". Retornando para a loja.",true);
		 
					}
				}
				else{
					Util::log($_POST['ProdID_1']. " - Pedido ja estava com status de pago no banco de dados. Retornando para a loja.");
		 
				}
				$idref = $_POST['ProdID_1'];
				//Util::log($_POST['ProdID_1']. " - Redirecionando para o processamento do arquivo order/pay.php?id=$idref");
					
				//Utility::Redirect( WEB_ROOT . "/order/pay.php?id={$idref}");
				Utility::Redirect( WEB_ROOT );	
				
			}
			else {
			
				Util::log($_POST['ProdID_1']. " - Pedido com status nao aprovado: ".$_POST['StatusTransacao']);
				
				$body =  "O pedido numero ".$_POST['ProdID_1']." ainda nao foi aprovado pelo pagseguro. O status esta ".$_POST['StatusTransacao'] .". Por isso ainda nao houve alteracao no status deste pedido no sistema de ofertas.";
				
				 $to = $INI['pagseguro']['acc']; 
				 $site = $INI['system']['sitename']; 
				 $body = " <h3>Dados da Compra</h3>
				 <br>Email da conta do pagseguro: <b>".$to."</b>
				 <br> Numero do pedido no sistema de ofertas: <b>".$ProdID_1."</b>
				 <br> Nome do cliente: <b>".$_POST['CliNome']."</b> 
				 <br> Email do cliente: <b>".$_POST['CliEmail']."</b> 
				 <br> Status da transacao: <b>".$_POST['StatusTransacao']."</b>   
				 <br> Tipo do pagamento: <b>".$_POST['TipoPagamento']."</b>   
				 <br> Produto comprado: <b>".$_POST['ProdDescricao_1']."</b>   
				 <br> Codigo produto: <b>".$_POST['ProdID_1']."</b>   
				 <br> Data do pagamento: <b>".$_POST['DataTransacao']."</b> " ;
				 
				 $body = utf8_encode($body); 
				 
				if(Util::postemail($body,utf8_decode($site. " - Pedido ".$_POST['ProdID_1']." ".$_POST['StatusTransacao']))){
					Util::log($_POST['ProdID_1']. " - Email enviado para (".Util::EMAIL_WEBMASTER.")... Retornando para a loja ");
				}
				else{
					 Util::log($_POST['ProdID_1']. " - Erro no envio do email (".Util::EMAIL_WEBMASTER.")... Retornando para a loja ");
				}
				 
			}
			 
  
	} else if ($result == "FALSO") {
	
	     Util::log("Token nao validado.");
	 
		 $to = $INI['pagseguro']['acc']; 
		 $body = "Retorno Pagseguro - token nao foi validado -  result retornou um false. <br> 
		 Confirme seu token no painel do pagseguro: token: <b>".TOKEN."</b>  
		 <br>Email da conta do pagseguro: <b>".$to."</b>
		 <br> Numero do pedido no sistema de ofertas: <b>".$ProdID_1."</b>
		 <br> Nome do cliente: <b>".$_POST['CliNome']."</b> 
		 <br> Email do cliente: <b>".$_POST['CliEmail']."</b> 
		 <br> Status da transacao: <b>".$_POST['StatusTransacao']."</b>   
		 <br> Tipo do pagamento: <b>".$_POST['TipoPagamento']."</b>   
		 <br> Produto comprado: <b>".$_POST['ProdDescricao_1']."</b>   
		 <br> Codigo produto: <b>".$_POST['ProdID_1']."</b>   
		 <br> Data do pagamento: <b>".$_POST['DataTransacao']."</b> " ;
		 
		 $body = utf8_decode($body);
		// $body =  $body."<br><br>Parametros: <br>".$param;
		 Util::postemail($body,utf8_decode($site. "Token nao validado."));
				
		
	} else {
	
		Util::log("Erro na integracao com o PagSeguro.");
	 
		 $to = $INI['pagseguro']['acc']; 
		 $body = "Retorno Pagseguro - erro na integracao do pagseguro <br>  Os dados nao foram atualizados no sistema de ofertas.<br>
		 <br> Numero do pedido no sistema de ofertas: <b>".$ProdID_1."</b>
		 <br> Nome do cliente: <b>".$_POST['CliNome']."</b> 
		 <br> Email do cliente: <b>".$_POST['CliEmail']."</b> 
		 <br> Status da transacao: <b>".$_POST['StatusTransacao']."</b>   
		 <br> Tipo do pagamento: <b>".$_POST['TipoPagamento']."</b>   
		 <br> Produto comprado: <b>".$_POST['ProdDescricao_1']."</b>   
		 <br> Codigo produto: <b>".$_POST['ProdID_1']."</b>   
		 <br> Data do pagamento: <b>".$_POST['DataTransacao']."</b> " ;
		 
		 $body = utf8_decode($body);
		 $body =  $body."<br><br>Parametros: <br>".$param;
		 Util::postemail($body,utf8_decode($site. "Erro na integracao com o PagSeguro."));
	}	
	
} else {
	Util::log("POST nao recebido, indica que a requisicao e o retorno do Checkout PagSeguro");
	// POST não recebido, indica que a requisição é o retorno do Checkout PagSeguro.
	// No término do checkout o usuário é redirecionado para este bloco.
	Utility::Redirect( WEB_ROOT );	
}
?>